/*-------------------------------------------------------------------------
 *
 * 前端代码的命令行选项处理功能
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 * src/fe_utils/option_utils.c
 *
 *-------------------------------------------------------------------------
 */

#include "postgres_fe.h"

#include "common/logging.h"
#include "common/string.h"
#include "fe_utils/option_utils.h"

/*
 * 提供严格统一的 --help 和 --version 选项处理。
 */
void handle_help_version_opts(int fc_argc, char *fc_argv[],
						 const char *fc_fixed_progname, help_handler fc_hlp)
{
	if (fc_argc > 1)
	{
		if (strcmp(fc_argv[1], "--help") == 0 || strcmp(fc_argv[1], "-?") == 0)
		{
			fc_hlp(get_progname(fc_argv[0]));
			exit(0);
		}
		if (strcmp(fc_argv[1], "--version") == 0 || strcmp(fc_argv[1], "-V") == 0)
		{
			printf("%s (PostgreSQL) " PG_VERSION "\n", fc_fixed_progname);
			exit(0);
		}
	}
}

/*
 * option_parse_int
 *
 * 解析选项的整数值。如果解析成功，返回 true 并将结果存储在 *result 中（如果给定）；如果解析失败，返回 false。
 */
bool option_parse_int(const char *fc_optarg, const char *fc_optname,
				 int fc_min_range, int fc_max_range,
				 int *fc_result)
{
	char	   *fc_endptr;
	int			fc_val;

	errno = 0;
	fc_val = strtoint(fc_optarg, &fc_endptr, 10);

	/*
	 * 跳过任何尾随空白；如果在终止字符之前剩下任何非空白字符，则失败。
	 */
	while (*fc_endptr != '\0' && isspace((unsigned char) *fc_endptr))
		fc_endptr++;

	if (*fc_endptr != '\0')
	{
		pg_log_error("invalid value \"%s\" for option %s",
					 fc_optarg, fc_optname);
		return false;
	}

	if (errno == ERANGE || fc_val < fc_min_range || fc_val > fc_max_range)
	{
		pg_log_error("%s must be in range %d..%d",
					 fc_optname, fc_min_range, fc_max_range);
		return false;
	}

	if (fc_result)
		*fc_result = fc_val;
	return true;
}
